package com.qingcloud.adminbackend.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qingcloud.adminbackend.base.AjaxResult;
import com.qingcloud.adminbackend.entity.equipment.StationGroupEquipmentBO;
import com.qingcloud.adminbackend.entity.equipment.SysEquipment;
import com.qingcloud.adminbackend.entity.equipment.SysEquipmentDTO;
import com.qingcloud.adminbackend.entity.stationgroup.*;
import com.qingcloud.adminbackend.entity.stationgroup.*;
import com.qingcloud.adminbackend.entity.user.SysUser;
import com.qingcloud.adminbackend.entity.usergroup.SysUsergroup;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 设备组 服务类
 * </p>
 *
 * @author luozehua
 * @since 2018-11-15
 */
public interface ISysStationGroupService extends IService<SysStationGroup> {
    /**
     * 分页查询设备组
     *
     * @param sysStationGroup
     * @return
     */
    IPage<SysStationGroup> findStationGroupPage(SysStationGroupBO sysStationGroup, String userId, Boolean isAdmin);

    /**
     * 通过ID查询设备组
     *
     * @param id
     * @return
     */
    SysStationGroup findStationGroupById(String id);

    /**
     * 可用设备组
     *
     * @param orgId
     * @return
     */
    List<SysStationGroup> findStationGroup(String orgId);


    List<SysStationGroup> findEqMgStationGroup(List<String> orderIds, List<String> orgIds, String userId);

    /**
     * 绑定客户与设备组的关系
     *
     * @return
     */
    AjaxResult addStationGroupOrg(SysStationGroupDTO sysStationGroupDTO);

    /**
     * 添加设备组
     *
     * @param addParam    设备组添加参数
     * @param loginUserId 当前登录用户ID
     * @return
     */
    boolean addStationGroup(StationgroupAddParam addParam, String loginUserId);

    /**
     * 批量删除设备组
     *
     * @param ids
     * @return
     */
    boolean deleteStationGroup(List<String> ids);

    JSONObject findAuthStationGroup(String id, String userId, Boolean isAdmin);

    /**
     * 设备组授权给用户组或用户
     *
     * @param stationgroupAuthParam  授权对象
     * @param userId                 当前登录用户ID
     * @param haveStationgroupIdList 当前登录用户拥有的权限
     * @return
     */
    AjaxResult authStationGroup(StationgroupAuthParam stationgroupAuthParam, String userId, List<String> haveStationgroupIdList);

    List<SysUsergroup> findLikeUserGroup(String query);

    List<SysUser> findLikeUser(String query);

    IPage<SysEquipmentDTO> findStationGroupEquipment(String groupId, Integer currentPage, Integer prePage);

    /**
     * 查询设备列表
     *
     * @param orgId
     * @param groupId
     * @param query
     * @param currentPage
     * @param prePage
     * @param oriGroupId
     * @return
     */
    IPage<SysEquipment> findSAddtationGroupEquipment(String orgId, String groupId, String query, Integer currentPage, Integer prePage, String oriGroupId);

    /**
     * 修改设备组
     *
     * @param addParam    参数对象
     * @param loginUserId 当前登录用户ID
     * @return
     */
    void updateStationGroup(StationgroupAddParam addParam, String loginUserId);

    IPage<SysUser> findUserPageByGroup(String groupId, Integer currentPage, Integer prePage);

    List<SysStationGroup> findMyStationGroup(String orgId);

    Map<String, Object> addEquipment(SysStationGroupEquipmentParam equipmentParam, String userId);

    /**
     * 设备组移除设备
     *
     * @param equipmentParam
     */
    void removeEquipment(SysStationGroupEquipmentParam equipmentParam);

    List<SysStationGroup> findStationGroupByOrgId(String orgId);

    List<SysStationGroup> findStationGroup2AuthUser(String orgId, String userId, Boolean isAdmin);

    /**
     * 根据用户ID查询已经授权给用户的设备组
     *
     * @param userId 用户ID
     */
    List<StationgroupAuthDTO> findByUserId(String userId);

    /**
     * 根据用户组ID查询已经授权给用户的设备组
     *
     * @param usergroupId 用户组ID
     */
    List<StationgroupAuthDTO> findByUsergroupId(String usergroupId);

    /**
     * 订单下的设备及设备组下的设备
     *
     * @param stationGroupEquipmentBO
     * @return
     */
    IPage<SysEquipmentDTO> findStationGroupEquipmentList(StationGroupEquipmentBO stationGroupEquipmentBO);

    /**
     * 根据设备组ID查询已经被授权的用户组和用户
     *
     * @param groupId
     * @return
     */
    JSONObject findAuthedUsersAndUserGroups(String groupId);

    /**
     * 设备管理权限的设备组授权给用户
     *
     * @param stationgroupAuthParam 设备组和用户信息
     * @param request               请求用户信息
     */
    void authStationManage(StationgroupAuthParam stationgroupAuthParam, String userId);

    /**
     * 设备管理权限授权给用户时可用设备组列表
     *
     * @param orgId 用户所属组织ID
     * @return 设备组列表
     */
    List<SysStationGroup> findAuthStationgroupManage(String orgId, String loginUserId, Boolean isAdmin);

    /**
     * 检查属于分支机构的设备组下的设备是否被授权
     */
    void checkEquipmentAuth();


}
